import subprocess
import sys
import os

def check_node_installed():
    try:
        # 获取Node.js版本并处理可能的错误
        try:
            node_result = subprocess.run(['node', '--version'], capture_output=True, text=True, shell=True)
            if node_result.returncode != 0 or not node_result.stdout.strip():
                print(f"获取Node.js版本失败: {node_result.stderr.strip() or '无版本信息返回'}")
                return False
            
            # 获取npm版本并处理可能的错误
            npm_result = subprocess.run(['npm', '--version'], capture_output=True, text=True, shell=True)
            if npm_result.returncode != 0 or not npm_result.stdout.strip():
                print(f"获取npm版本失败: {npm_result.stderr.strip() or '无版本信息返回'}")
                return False
            
            print(f"检测到Node.js版本: {node_result.stdout.strip()}")
            print(f"检测到npm版本: {npm_result.stdout.strip()}")
            return True
        except FileNotFoundError:
            print("未找到Node.js或npm命令，请确保已正确安装并添加到PATH环境变量")
            return False
    except Exception as e:
        print(f"检测Node.js和npm时发生错误: {str(e)}")
        return False

def download_file(url, save_path):
    """下载文件到本地"""
    import urllib.request
    import os
    try:
        print(f"正在下载: {url}")
        urllib.request.urlretrieve(url, save_path)
        print(f"文件已保存到: {save_path}")
        return True
    except Exception as e:
        print(f"下载失败: {str(e)}")
        return False

def check_vs_build_tools():
    """检查是否安装了Visual Studio构建工具"""
    try:
        # 检查是否安装了Visual Studio Build Tools
        result = subprocess.run(['where', 'msbuild'], capture_output=True, text=True, shell=True)
        if result.returncode == 0:
            print("检测到Visual Studio构建工具")
            return True
        else:
            print("未检测到Visual Studio构建工具，正在尝试自动安装...")
            
            # 下载Visual Studio Build Tools安装包
            vs_build_tools_url = "https://aka.ms/vs/17/release/vs_BuildTools.exe"
            installer_path = os.path.join(os.getenv('TEMP'), 'vs_BuildTools.exe')
            
            if not download_file(vs_build_tools_url, installer_path):
                print('请手动安装Visual Studio 2017或更高版本，并包含"Desktop development with C++"工作负载')
                print("下载地址: https://visualstudio.microsoft.com/zh-hans/downloads/")
                return False
                
            # 运行安装程序
            try:
                print(f"正在运行安装程序: {installer_path}")
                install_result = subprocess.run(
                    [installer_path, '--quiet', '--wait', '--norestart', '--add', 'Microsoft.VisualStudio.Workload.VCTools', '--includeRecommended'],
                    capture_output=True,
                    text=True,
                    shell=True
                )
                print(f"安装程序返回码: {install_result.returncode}")
                print(f"安装程序输出: {install_result.stdout.strip() or '无输出'}")
                print(f"安装程序错误: {install_result.stderr.strip() or '无错误'}")
                
                if install_result.returncode == 0:
                    print("Visual Studio构建工具安装成功！")
                    return True
                else:
                    print(f"自动安装失败: {install_result.stderr.strip() or '未知错误'}")
                    print('请手动安装Visual Studio 2017或更高版本，并包含"Desktop development with C++"工作负载')
                    print("下载地址: https://visualstudio.microsoft.com/zh-hans/downloads/")
                    print("建议解决方案:")
                    print("1. 以管理员身份运行此脚本")
                    print("2. 检查临时目录是否有足够空间")
                    print("3. 检查网络连接是否正常")
                    return False
            except Exception as e:
                print(f"自动安装过程中发生错误: {str(e)}")
                print('请手动安装Visual Studio 2017或更高版本，并包含"Desktop development with C++"工作负载')
                print("下载地址: https://visualstudio.microsoft.com/zh-hans/downloads/")
                return False
    except Exception as e:
        print(f"检查Visual Studio构建工具时出错: {str(e)}")
        return False

def install_n8n():
    print("正在安装n8n...")
    try:
        # 检查构建工具
        if not check_vs_build_tools():
            print("\n安装n8n需要Visual Studio构建工具，请先安装后再运行此脚本")
            sys.exit(1)
            
        # 安装n8n
        result = subprocess.run(['npm', 'install', '-g', 'n8n'], capture_output=True, text=True, shell=True)
        
        if result.returncode == 0:
            print("n8n安装成功！")
            print("运行命令: n8n 启动服务")
        else:
            print(f"安装失败，详细错误信息:\n{result.stderr}")
            print("\n常见解决方案:")
            print("1. 确保已安装Visual Studio构建工具")
            print("2. 以管理员身份运行此脚本")
            print("3. 检查网络连接")
            sys.exit(1)
    except Exception as e:
        print(f"安装过程中发生意外错误: {str(e)}")
        sys.exit(1)

if __name__ == "__main__":
    print("检查Node.js和npm是否已安装...")
    if not check_node_installed():
        print("未检测到Node.js和npm，请先安装Node.js")
        print("可以从 https://nodejs.org/ 下载安装")
        sys.exit(1)
    
    install_n8n()